package tech.aistar.day14;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 本类用来演示: 反射操作方法
 *
 * @author: success
 * @date: 2021/3/25 10:32 上午
 */
public class MethodDemo {
    public static void main(String[] args) {
        //1. 获取class实例
        Class<?> c = Point.class;
        //2. 根据指定的方法名以及方法的参数列表来获取指定的Method实例
        try {
            //Method m = c.getDeclaredMethod("test01");

            //调用带参方法
            //Method m = c.getDeclaredMethod("test01",int.class);

            //静态方法
            Method m = c.getDeclaredMethod("test01",int.class,String.class);

            //反射创建对象
            Point p = (Point) c.newInstance();

            m.setAccessible(true);

            //反射调用私有方法
            //m.invoke(p);

            //传入参数并且还是有返回类型
            //String result = (String) m.invoke(p,100);
             //静态方法 - 不需要对象.
             m.invoke(null,100,"admin");

            //System.out.println(result);

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        System.out.println("===反射获取方法的元信息===");

        //获取所有的方法的Method[]
        Method[] methods = c.getDeclaredMethods();

        for (int i = 0; i < methods.length; i++) {
            //输出方法的修饰符
            System.out.print(Modifier.toString(methods[i].getModifiers())+" ");
            //获取方法的返回类型
            System.out.print(methods[i].getReturnType().getSimpleName()+" ");
            //获取方法的名称
            System.out.print(methods[i].getName()+" (");
            //方法的参数列表 - 重点是关注参数的类型
            Class<?>[] params = methods[i].getParameterTypes();
            if(null!=params && params.length>0){
                for (int j = 0; j < params.length; j++) {
                    if(j!=params.length-1){
                        System.out.print(params[j].getSimpleName()+",");
                    }else{
                        System.out.print(params[j].getSimpleName());
                    }
                }
            }
            System.out.println(")");
        }
    }
}
